Модуль:Void
WARFRAME Wiki Void Drop Table --http://warframe.wikia.com/ --Written by User:ChickenBar local p = {} local VoidData = mw.loadData( 'Module:Void/data' ) local Icon = require( "Module:Icon" ) local Shared = require( "Module:Shared" ) local TxtColors = {Common = '#9C7344', Uncommon = '#D3D3D3', Rare = '#D1B962'} local tooltipStart = "" local tooltipEnd = "" -- Converts item names in data to proper names -- So for example 'LATRON' becomes 'Latron Prime' function p.getItemName(itemStr) caseItem = string.gsub(itemStr, "(%a)(%w_'*)", Shared.titleCase) if(itemStr ~= "FORMA") then caseItem = caseItem.." Weapon" end return caseItem end -- Converts part names in data to proper casing function p.getPartName(partStr, keepBlueprint) --User:Falterfire 6/19/2018: -- New parameter to remove ' Blueprint' if wanted -- IE returns 'Neuroptics' instead of 'Neuroptics Blueprint' if keepBlueprint nil then keepBlueprint = true end local result = string.gsub(partStr, "(%a)(%w_'*)", Shared.titleCase) if not keepBlueprint and Shared.contains(result, ' Blueprint') then result = string.gsub(result, ' Blueprint', ) end return result end --Gets the relic with the appropriate name function p.getRelic(Tier, Name) for i, relic in pairs(VoidData"Relics") do if (relic.Tier Tier and relic.Name Name) then return relic end end return nil end --Right now, all relics are on the same platform --If that changes, this function will allow separating by platform function p.isRelicOnPlatform(Relic, Platform) local Platforms = Relic.Platforms if(Platforms nil) then return true else local foundIt = false for i, plat in pairs(Platforms) do if (plat Platform) then foundIt = true end end return foundIt end end --Returns the rarity if a relic drops a part --Otherwise, returns nil function p.getRelicDropRarity(Relic, item, part) for i, drop in pairs(Relic.Drops) do if ( drop.Item item and drop.Part part) then return drop.Rarity end end return nil end --Returns the part icon for a drop --(IE Braton Weapon Barrel returns the Weapon Barrel icon) function p.getPartIconForDrop(drop) local iName = p.getItemName(drop.Item) local pName = p.getPartName(drop.Part) local iconSize = local primeToggle = 'Weapon ' if iName 'Forma' then iconSize = '43' else iconSize = '54' end if iName 'Odonata Weapon' then if pName 'Harness Blueprint' or pName 'Systems Blueprint' or pName 'Wings Blueprint' then primeToggle = 'Archwing ' end elseif pName 'Carapace' or pName 'Cerebrum' or pName 'Systems' then primeToggle = '' end local icon ='' if(pName 'Blueprint') then icon = Icon._Weapon(Shared.titleCase(drop.Item), nil,iconSize) elseif iName 'Kavasa Weapon' then icon = Icon._Prime('Kavasa', nil,iconSize) else icon = Icon._Item(primeToggle..pName,"",iconSize) end return icon end --Returns the item icon for a drop --(IE Braton Weapon Barrel returns the Braton Weapon icon) function p.getItemIconForDrop(drop) local iName = p.getItemName(drop.Item) local pName = p.getPartName(drop.Part) local iconSize ='' if iName 'Forma' then iconSize = '38' else iconSize = '38' end local icon ='' icon = Icon._Weapon(Shared.titleCase(drop.Item), nil, iconSize) return icon end function p.item(frame) local platform = frame.args1 local item_type = frame.args2 local item_part = frame.args3 local relic_tier = frame.args4 return p._item(item_type,item_part,relic_tier,platform) end function p._item(item_type,item_part,relic_tier,platform) item_type = string.upper(item_type) item_part = string.upper(item_part) if (item_part "HELMET BLUEPRINT") then item_part = "NEUROPTICS BLUEPRINT" end local locations = {} local vaultLocations = {} local i for i, relic in pairs(VoidData"Relics") do if(p.isRelicOnPlatform(relic, platform) and (relic_tier nil or relic.Tier relic_tier)) then local dropRarity = p.getRelicDropRarity(relic, item_type, item_part) if(dropRarity ~= nil) then local relicText = relic.Tier.." "..relic.Name local relicString = tooltipStart..relicText..tooltipCenter..""..relicText..""..tooltipEnd.." "..dropRarity if(relic.IsVaulted 1) then relicString = relicString.." (V)" table.insert(vaultLocations, relicString) else if(relic.IsBaro 1) then relicString = relicString.." (B)" end table.insert(locations, relicString) end end end end for _, i in pairs(vaultLocations) do table.insert(locations, i) end return table.concat(locations, " ") end function p.relicTooltip(frame) local relicName = frame.args ~= nil and frame.args1 or frame local platform = frame.args ~= nil and frame.args2 if(platform nil) then platform = 'PC' end if(relicName nil) then return nil end local bits = Shared.splitString(relicName, ' ') local Tier = bits1 local RName = bits2 local theRelic = p.getRelic(Tier, RName) if(theRelic nil) then return 'ERROR: No relic found' end if(not p.isRelicOnPlatform(theRelic, Platform)) then return "ERROR: That relic isn't on that platform" end local result = ' ' return result end function p.getRelicDrop(frame) local relicName = frame.args ~= nil and frame.args1 or nil local rarity = frame.args ~= nil and frame.args2 or nil local number = frame.args ~= nil and frame.args3 or nil if number nil then --The number of the drop defaults to 1 if not set number = 1 elseif type(number) 'string' then --If the argument is a string, force it into being a number number = tonumber(number) end --Platform comes from a special argument. Defaults to PC if not set local platform = frame.args ~= nil and frame.args.platform or nil if platform nil then platform = 'PC' end --Return an error if any arguments are missing if relicName nil or relicName '' then return "ERROR: Missing argument 'Relic Name'" elseif rarity nil or rarity '' then return "ERROR: Missing argument 'Rarity'" end local bits = Shared.splitString(relicName, ' ') local Tier = bits1 local RName = bits2 local theRelic = p.getRelic(Tier, RName) --Return an error if the relic wasn't found if theRelic nil then return "ERROR: Invalid relic '"..relicName.."'" end local count = 0 for i, drop in pairs(theRelic.Drops) do --Loop through the drops to find drops of the chosen rarity if drop.Rarity rarity then count = count + 1 --Once enough drops of the right kind have been found, return the icon + the item name if count number then local iName = p.getItemName(drop.Item) local pName = p.getPartName(drop.Part, false) local icon = p.getItemIconForDrop(drop) return icon..' '..iName..' '..pName..'' end end end --If we got to here, there weren't enough drops of that rarity for this relic. return "ERROR: Only found "..count.." drops of "..rarity.." rarity for "..relicName end function p.getRelicTotal(frame) local total = 0 if(Shared.contains(frame.args, "unvaulted")) then for _,relic in pairs(VoidData"Relics") do if(relic.IsVaulted 0) then total = total + 1 end end end if(Shared.contains(frame.args, "vaulted")) then for _,relic in pairs(VoidData"Relics") do if(relic.IsVaulted 1) then total = total + 1 end end end if(Shared.contains(frame.args, "baro")) then for _,relic in pairs(VoidData"Relics") do if(relic.IsBaro 1) then total = total + 1 end end end if(frame.args1 nil) then total = Shared.tableCount(VoidData"Relics") end return total end local function relicData() --This is snatched from m:VoidByReward p.byReward local data = {} for _, relic in pairs(VoidData"Relics") do for i, drop in pairs(relic.Drops) do local newObj = {Tier = relic.Tier, Name = relic.Name, Rarity = drop.Rarity, IsVaulted = relic.IsVaulted 1, IsBaro = relic.IsBaro 1} if (datadrop.Item nil) then datadrop.Item = {} end if(datadrop.Itemdrop.Part nil) then datadrop.Itemdrop.Part = {} end table.insert(datadrop.Itemdrop.Part, newObj) end end return data end local function checkData(data) if data nil or type(data) ~= 'table' then local data = relicData() return data elseif type(data) 'table' then return data end end local function getItemRarities(itemName, partName, data) local data = checkData(data) local rarities ={} itemName = string.upper(itemName) partName = string.upper(partName) for n, drop in Shared.skpairs(dataitemNamepartName) do raritiesdrop.Rarity = true end --for rar, n in pairs(rarities) do mw.log(rar) end-- return rarities end function p.getDucatValue(frame) --This is just for invoking p._getDucatValue on article pages. local itemName = frame.args ~= nil and frame.args1 or nil local partName = frame.args ~= nil and frame.args2 or nil if itemName nil or itemName '' then return 'Item name missing' elseif partName nil or partName '' then return 'Part name missing' end return p._getDucatValue(itemName, partName) end function p._getDucatValue(itemName, partName, data) --Calculating the ducat value of an item. A few don't follow the rule of (common=15, uncommon=45, rare=100, common+uncommon=25, uncommon+rare=65) so they are handled before calling "getItemRarities" for a slight efficiency gain. --A small local function for checking if the two strings match. local function uCheck(name, expected) if string.upper(name) string.upper(expected) then return true end return false end if uCheck(itemName, 'Soma') and uCheck(partName, 'Blueprint') then return 15 elseif uCheck(itemName, 'Braton') and uCheck(partName, 'Stock') then return 15 elseif uCheck(itemName, 'Ankyros') and uCheck(partName, 'Blade') then return 65 elseif uCheck(itemName, 'Rhino') and uCheck(partName, 'Chassis Blueprint') then return 65 end local data = checkData(data) local rarities = getItemRarities(itemName, partName, data) local ducatValue = 0 local lenght = Shared.tableCount(rarities) --For checking whether the table contains a dictionary of the particular rarity. local function tableContains(table, rarity) for rar, value in pairs(table) do if rar rarity then return true end end return false end --Checking whether the lenght of table "rarities" is 1 or 2 and accordingly perform more checks to assing the correct ducat value. if lenght 1 then if rarities'Common' then return 15 elseif rarities'Uncommon' then return 45 elseif rarities'Rare' then return 100 end elseif lenght 2 then if tableContains(rarities, 'Common') then return 25 elseif tableContains(rarities, 'Rare') then return 65 end elseif lenght 3 then return 25 end return ducatValue end function p.getTotalDucats(frame) local tierName = frame.args ~= nil and frame.args1 local data = relicData() local totalItemCount = 0 --counting all items local withoutFormaCount = 0 --counting all items excluding forma local totalDucats = 0 --all, including duplicates, itemDucats local availableDucats = 0 --total ducats for items from available relics local availableItems = 0 --available items local availableItemsEF = 0 --available items excluding forma local vaultedDucats = 0 --total ducats for items from vaulted relics local vaultedItems = 0 --vaulted items local vaultedItemsEF = 0 --vaulted items excluding forma local result = '' for item, parts in Shared.skpairs(data) do for part, drops in Shared.skpairs(parts) do for n, drop in Shared.skpairs(drops) do if tierName drop.Tier or tierName nil then if drop.IsVaulted then vaultedItems = vaultedItems + 1 else availableItems = availableItems + 1 end totalItemCount = totalItemCount + 1 if item ~= 'FORMA' then local tempDucat =p._getDucatValue(item, part, data) totalDucats = totalDucats + tempDucat withoutFormaCount = withoutFormaCount + 1 if drop.IsVaulted then vaultedDucats = vaultedDucats + tempDucat vaultedItemsEF = vaultedItemsEF + 1 else availableDucats = availableDucats + tempDucat availableItemsEF = availableItemsEF + 1 end end end end end end if tierName then result = "Average Ducats Value: "..Icon._Item('Ducats')..""..Shared.round((totalDucats / totalItemCount),2).." ("..totalItemCount..' rewards with '..withoutFormaCount..' parts)' result = result.." Available: "..Icon._Item('Ducats')..""..Shared.round((availableDucats/availableItems),2).." ("..availableItems..' rewards with '..availableItemsEF..' parts)' result = result.." | Vaulted: "..Icon._Item('Ducats')..""..Shared.round((vaultedDucats/vaultedItems),2).." ("..vaultedItems..' rewards with '..vaultedItemsEF..' parts)' else result = "Total Ducats Value: "..Icon._Item('Ducats')..""..Shared.formatnum(totalDucats).." ("..totalItemCount..' rewards with '..withoutFormaCount..' parts)' result = result.." Available: "..Icon._Item('Ducats')..""..Shared.formatnum(availableDucats).." ("..availableItems..' rewards with '..availableItemsEF..' parts)' result = result.." | Vaulted: "..Icon._Item('Ducats')..""..Shared.formatnum(vaultedDucats).." ("..vaultedItems..' rewards with '..vaultedItemsEF..' parts)' end return result end local function ducatPriceRow(itemName, partName, tierName, data) local ducatValue = p._getDucatValue(itemName, partName, data) local sortValue = '' local function createRelicText(itemName, partName, tierName, data) itemName = string.upper(itemName) partName = string.upper(partName) local locations = {} local vaultLocations = {} for n, drop in Shared.skpairs(dataitemNamepartName) do if drop.Tier tierName or tierName nil then local dropRarity = drop.Rarity if dropRarity ~= nil then local relicText = drop.Tier.." "..drop.Name local relicString = tooltipStart..relicText..tooltipCenter..""..relicText..""..tooltipEnd.." "..dropRarity if drop.IsVaulted then relicString = relicString.." (V)" table.insert(vaultLocations, relicString) else if drop.IsBaro then relicString = relicString.." (B)" end table.insert(locations, relicString) end end end end for _, i in pairs(vaultLocations) do table.insert(locations, i) end return table.concat(locations, " ") end if itemName nil or itemName '' or partName nil or partName '' then return 'Please enter item and part names' end --first cell if partName 'Blueprint' then sortValue = itemName..' _'..partName else sortValue = itemName..' '..partName end local cell1 = '\n|data-sort-value="'..sortValue..'"|'..Icon._Prime(itemName,partName) local cell2 = '\n|'..createRelicText(itemName, partName, tierName, data) local cell3 = '\n|data-sort-value="'..ducatValue..'"|'..Icon._Item('Ducats')..""..ducatValue.."\n|-" return cell1..cell2..cell3 end function p.ducatRelicList(frame) local data = relicData() local tierName = frame.args ~= nil and frame.args1 or nil --Adding switch to choose only vaulted or unvaulted items to show local listMode = frame.args ~= nil and frame.args2 or 'ALL' listMode = string.upper(listMode) local itemList = {} local result = {} for item, parts in Shared.skpairs(data) do if item ~= 'FORMA' then for part, drops in Shared.skpairs(parts) do for i, drop in pairs(drops) do if drop.Tier tierName or tierName nil then local tempName = '' if part 'BLUEPRINT' then tempName = Shared.titleCase(item..'<> '..part) else tempName = Shared.titleCase(item..'<>'..part) end if not Shared.contains(itemList, tempName) then if listMode 'VAULTED' then if drop.isBaro or drop.IsVaulted then table.insert(itemList, tempName) end elseif listMode 'UNVAULTED' then if not drop.IsBaro and not drop.IsVaulted then table.insert(itemList, tempName) end else table.insert(itemList, tempName) end end end end end end end table.sort(itemList) for num, itm in pairs(itemList) do local item = Shared.splitString(itm, '<>') item1 = Shared.trim(item1) item2 = Shared.trim(item2) table.insert(result, (ducatPriceRow(item1, item2, tierName, data))) end return table.concat(result) end return p